<?php
/**
 * Apissl 래퍼
 *
 * 백엔드 암.복호화 유틸리티
 * 해당 라이브러리는 직접 호출하는것을 권장하지 않습니다.
 * 코어에서 제공하는 공개 인터페이스를 사용해주시기 바랍니다.
 *
 * @author Platform Team
 */

class utilSslwrapBackend extends utilSslwrapAbstract
{
    /**
     * 암호화
     *
     * @param string    $sHost (호스트 - 예 : http://a.com)
     * @param mixed     $mData (대상 데이터 - 예 : array('a' => 'abcd'))
     * @param string    $sHash (해시키 - 예 : 623d8db49223f8ecef34ae8144115b86)
     * @param string    $sType (타입 - 로그용)
     * @return utilSslwrapException | string
     */
    public static function encrypt($sHost, $mData, $sHash, $sType)
    {
        $sUrl = self::_getCryptUrl($sHost);

        $aParam = array(
            'method' => 'encrypt',
            'type' => $sType,
            'hKey' => $sHash,
            'token' => self::_convEncrypt($mData)
        );

        $mResponse = self::_curl($sUrl, $aParam);
        $mResult = self::_result($mResponse);

        return $mResult;
    }

    /**
     * 복호화
     *
     * @param string    $sHost   (호스트 - 예 : http://a.com)
     * @param mixed     $sData   (암호화 문자열)
     * @param string    $sHash   (해시키 - 예 : 623d8db49223f8ecef34ae8144115b86)
     * @param string    $sType   (타입 - 로그용)
     * @param string    $sFromIp (복호화 요청 서버 아이피)
     * @return utilSslwrapException | string
     */
    public static function decrypt($sHost, $sData, $sHash, $sType, $sFromIp=null)
    {
        $sUrl = self::_getCryptUrl($sHost);

        $aParam = array(
            'method' => 'decrypt',
            'type' => $sType,
            'hKey' => $sHash,
            'from' => self::_fromIp($sFromIp),
            'token' => $sData
        );

        $mResponse = self::_curl($sUrl, $aParam);
        $mResult = self::_result($mResponse);

        return is_object($mResult) ? $mResult : self::_convDecrypt($mResult);
    }

    /**
     * HASH 생성
     *
     * @param string $sHost
     * @param string $sPasswd
     * @param string $sPath
     * @return utilSslwrapException | true
     */
    public static function createHash($sHost, $sPasswd, $sPath)
    {
        $sUrl = self::_getHashManagerUrl($sHost);

        return self::_createHash($sUrl, $sPasswd, $sPath);
    }

    /**
     * HASH 갱신
     *
     * @param string $sHost
     * @param string $sPasswd
     * @param string $sPath
     * @return utilSslwrapException | true
     */
    public static function refreshHash($sHost, $sPasswd, $sPath)
    {
        $sUrl = self::_getHashManagerUrl($sHost);

        return self::_refreshHash($sUrl, $sPasswd, $sPath);
    }

    /**
     * HASH 만료
     *
     * @param string $sHost
     * @param string $sPasswd
     * @param string $sPath
     * @return utilSslwrapException | true
     */
    public static function expireHash($sHost, $sPasswd, $sPath)
    {
        $sUrl = self::_getHashManagerUrl($sHost);

        return self::_expireHash($sUrl, $sPasswd, $sPath);
    }

    /**
     * 복호화를 요청한 서버의 아이피 주소를 할당
     *
     * !!NOTICE!!
     * 1. 로컬->로컬 로 요청을 하는 경우
     * 2. 로컬->외부서버 로 요청을 하는 경우
     *
     * 위 2가지 경우를 만족해야 하므로, 명시적으로 요청 IP가 들어오지 않았을 경우는 자동으로 파악한다.
     *
     * @param string $sFromIp
     * @return string
     */
    private static function _fromIp($sFromIp=null)
    {
        if ($sFromIp !== null) {
            return $sFromIp;
        }

        $sClientIp = getClientRealIp();
        $sServerIp = $_SERVER['SERVER_ADDR'];

        if ($sClientIp == $sServerIp) {
            $aIpList = gethostbynamel(php_uname('n'));
            $sIp = $aIpList[0];
        } else {
            $sIp = $sClientIp;
        }

        return $sIp;
    }

    private static function _getCryptUrl($sHost)
    {
        return $sHost . '/ApiSSLManager.php';
    }

    private static function _getHashManagerUrl($sHost)
    {
        return $sHost . '/ApiManageKey.php';
    }
}
